#include "OpenGLBuffer.h"
#include "Debug/Instrumentor.h"


namespace Hazel {

    /////////////////////////////////////////////////////////////////////////////
    // VertexBuffer /////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////

    OpenGLVertexBuffer::OpenGLVertexBuffer(float *vertices, uint32_t size) {
        HZ_PROFILE_FUNCTION();
        // 生成顶点缓冲 创建vbo但是还没分配显存
        glGenBuffers(1, &m_RendererID);
        // 绑定数组缓冲  绑定到openGl状态机的buffer插槽中
        glBindBuffer(GL_ARRAY_BUFFER, m_RendererID);
        // 填充数组数据。三角形数据绑定到GPU上  这段代码分配显存  GL_STATIC_DRAW->模型不会变 GL_DYNAMIC_DRAW 模型经常变
        glBufferData(GL_ARRAY_BUFFER, size, vertices, GL_STATIC_DRAW);
    }

    OpenGLVertexBuffer::~OpenGLVertexBuffer() {
        HZ_PROFILE_FUNCTION();
        glDeleteBuffers(1, &m_RendererID);
    }

    void OpenGLVertexBuffer::Bind() const {
        HZ_PROFILE_FUNCTION();
        glBindBuffer(GL_ARRAY_BUFFER, m_RendererID);
    }

    void OpenGLVertexBuffer::Unbind() const {
        HZ_PROFILE_FUNCTION();
        glBindBuffer(GL_ARRAY_BUFFER, 0);
    }

    /////////////////////////////////////////////////////////////////////////////
    // IndexBuffer /////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////

    OpenGLIndexBuffer::OpenGLIndexBuffer(uint32_t *indices, uint32_t count):m_Count(count) {
        HZ_PROFILE_FUNCTION();
        // 生成索引缓冲，本质都是缓冲和顶点缓冲没区别，存不同的数据而已
        glGenBuffers(1, &m_RendererID);
        // 绑定到索引缓冲
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_RendererID);
        // //将indices填充索引缓冲数据(发送到GPU) 定义索引 =线   Element Buffer Object = EBO 顶点绘制索引号
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, count * sizeof(uint32_t), indices, GL_STATIC_DRAW);
    }

    OpenGLIndexBuffer::~OpenGLIndexBuffer() {
        HZ_PROFILE_FUNCTION();
        glDeleteBuffers(1, &m_RendererID);
    }

    void OpenGLIndexBuffer::Bind() const {
        HZ_PROFILE_FUNCTION();
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_RendererID);
    }

    void OpenGLIndexBuffer::Unbind() const {
        HZ_PROFILE_FUNCTION();
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    }
}
